Melisa Di Giacomo
Consultas: melisa.digiacomo@gmail.com


En este material encontrarÔs una guía completa para aprender a crear y personalizar diferentes tipos de grÔficos para visualizar tus datos de manera efectiva. Desde grÔficos bÔsicos como histogramas y diagramas de dispersión, hasta grÔficos mÔs avanzados como barras apiladas y diagramas de violín, aquí podrÔs aprender cómo utilizar las funciones de R base y el tan utilizado paquete {ggplot2} para crear grÔficos atractivos y significativos. AdemÔs, encontrarÔs código en R y explicaciones detalladas para ayudarte a entender el proceso detrÔs de cada grÔfico. ”Comencemos a explorar el mundo de la visualización de datos!

GrƔficos con R base

GrƔfico de puntos

Realizaremos un grÔfico rÔpido con la función plot() utilizando el dataset pressure del paquete de R {datasets} que viene precargado.

plot(pressure)

En primer lugar, R observa que el data frame tiene dos columnas, por lo que asume que queremos graficar una columna frente a la otra. En segundo lugar, ya que no se proporcionan etiquetas para los ejes, R utiliza los nombres de las columnas. En tercer lugar, se crean marcas de graduacion del eje en numeros enteros.

Estos grÔficos tienen la ventaja de dar rÔpidamente una visualización de nuestro dataset.

Podrƭamos querer graficar otras columnas o en distinto orden por lo que es conveniente siempre indicar x e y. AdemƔs proporcionamos el tipo de grƔfico que queremos (type).

plot(x = pressure$temperature, y = pressure$pressure, type = 'p')

Esto resulta en un grÔfico simple. Aún así, R nos permite modificar aspectos estéticos del grÔfico: point shape (pch), color (col), límites de ejes (xlim e ylim), etiquetas de ejes (xlab e ylab), título (main), entre otros.

plot(x = pressure$temperature, y = pressure$pressure, type = 'p',
     pch = 19, col="red", xlim = c(0, 400), 
     xlab = "Temperature", ylab = "Pressure", main = "GrƔfico de puntos")

GrƔfico de lƭneas

Mismo grƔfico anterior pero ahora indicamos type = "l" para obtener un grƔfico de lƭneas.

plot(pressure$temperature, pressure$pressure, type = "l",
     xlab = "Temperature", ylab = "Pressure", main = "GrƔfico de lƭneas")

GrƔfico de barras

Dentro de {datasets} tenemos datos de Biochemical Oxygen Demand (BOD) que tiene dos columnas (Time y demand). Graficaremos la demanda de oxĆ­geno en los distintos tiempos.

barplot(BOD$demand, names.arg = BOD$Time, ylim = c(0, 20),
        xlab = "Time", ylab = "Biochemical Oxygen Demand", main = "GrƔfico de barras")

Histograma

Otros datos dentro de {datasets} pertenecen a Motor Trend Car Road Tests (mtcars). Haremos un histograma de la variable numƩrica mpg (Miles/(US) gallon).

hist(mtcars$mpg, breaks = 10, xlim = c(10, 35), 
     xlab = "Miles/(US) gallon", main = "Histograma")

GrƔfico de cajas

Ahora utilizaremos el dataset ToothGrowth para realizar un grƔfico de cajas o boxplot.
Se grafica la longitud de los odontoblastos (células responsables del crecimiento de los dientes) medidas en 60 cobayos comparando dos métodos de administración de vitamina C: jugo de naranja (OJ) o Ôcido ascórbico (VC).

boxplot(len ~ supp, data = ToothGrowth,
        xlab = "Delivery methods", ylab = "Tooth length", main = "GrƔfico de cajas")

Ventajas

Realizar grÔficos con R base, sin la utilización de un paquete, tiene la ventaja de utilizar funciones simples como plot(), barplot(), hist() y boxplot(). Como se pudo observar, son grÔficos de apariencia sencilla pero fÔciles y rÔpidos de realizar para un primer anÔlisis exploratorio de los datos. Ahora veremos cómo realizar grÔficos en R con el paquete {ggplot2} en los que podremos personalizar y darle un aspecto mÔs profesional a nuestros grÔficos.

Introducción a ggplot2

El paquete {ggplot2} de R es el mÔs utilizado para la visualización de datos. Forma parte del conjunto de paquetes llamado {tidyverse}. Utilizaremos la versión 3.4.1 de {ggplot2}.

Los principales elementos para representar un grƔfico con {ggplot2} son los siguientes:

  • Data: una estructura de datos con dos dimensiones (data frame) en la cual se puede guardar datos de distintos tipos (como caractĆ©res, enteros, valores de punto flotante, factores y mĆ”s) que se quieren visualizar.
  • Geoms: elementos geomĆ©tricos (puntos, lĆ­neas, cĆ­rculos, etc.) que se van a representar.
  • Aesthetics: una lista de relaciones entre las variables del data frame (como por ejemplo coordenadas x e y) y determinados aspectos estĆ©ticos del grĆ”fico (como formas, tamaƱos o colores).

Normalmente los geoms se van aƱadiendo de forma consecutiva en distintas capas (layers). Para aƱadir una nueva capa se usa el signo +.

Otros elementos importantes de un grƔfico en {ggplot2}, que pueden estar o no presentes, son: Stats (transformaciones estadƭsticas), Facets (grƔficos en paneles por grupo), Scales (controla tƭtulos, etiquetas, ejes), Themes (estilo de grƔficos).

La estructura general del código para obtener un grÔfico es:

ggplot(data = 'nombre del data frame') +
  geom_nombre1(aes(aesthetics1 = var1, aesthetics2 = var2, ...)) +
  geom_nombre2(...) 

El comando ggplot() se usa para generar el sistema de coordenadas (por defecto, rectangulares) y posteriormente vamos aƱadiendo los geoms con sus correspondientes aesthetics. En principio los aesthetics se pueden asignar individualmente para cada geom.

Primer grƔfico

Datos

Vamos a utilizar datos provenientes del paquete {agridat} que proporciona una amplia colección de conjuntos de datos de experimentos agrícolas provenientes de papers, libros y websites. Documentación: https://cran.rstudio.com/web/packages/agridat/agridat.pdf

# Cargar el paquete
library(agridat)

# Cargar el dataset
soybean <- australia.soybean

# Estructura dataset
str(soybean)
## 'data.frame':    464 obs. of  10 variables:
##  $ env    : Factor w/ 8 levels "B70","B71","L70",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ loc    : Factor w/ 4 levels "Brookstead","Lawes",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ year   : int  1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
##  $ gen    : Factor w/ 58 levels "G01","G02","G03",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ yield  : num  2.39 2.28 2.57 2.88 2.39 ...
##  $ height : num  1.45 1.45 1.46 1.26 1.33 ...
##  $ lodging: num  4.25 4.25 3.75 3.5 3.5 4 3 3.25 3 3.75 ...
##  $ size   : num  8.45 9.95 10.85 10.05 11 ...
##  $ protein: num  36.7 37.5 37.8 38.5 37.5 ...
##  $ oil    : num  20.9 20.7 21.3 22 22.1 ...

Podemos observar que el data frame tiene 464 observaciones con 10 variables:

  • env: ambiente, 8 niveles, primer caracter corresponde a la localidad y Ćŗltimos dos caracteres corresponden al aƱo.
  • loc: localidad, 4 niveles.
  • year: aƱo, numĆ©rico (int). En realidad son 2 niveles (1970 y 1971), debemos convertirlo.
  • gen: genotipos, del G01 - G58.
  • variables numĆ©ricas: rendimiento, altura, lodging, tamaƱo, proteĆ­nas y aceites.

Por una cuestión de tipo de dato para trabajar mÔs adelante, convertiremos year a factor de la siguiente manera:

soybean$year <- as.factor(soybean$year)
class(soybean$year) # comprobamos conversión
## [1] "factor"
Table. Australia soybean
env loc year gen yield height lodging size protein oil
L70 Lawes 1970 G01 2.387 1.445 4.25 8.45 36.70 20.895
L70 Lawes 1970 G02 2.282 1.450 4.25 9.95 37.55 20.740
L70 Lawes 1970 G03 2.567 1.460 3.75 10.85 37.80 21.295
L70 Lawes 1970 G04 2.877 1.260 3.50 10.05 38.45 21.990
L70 Lawes 1970 G05 2.392 1.335 3.50 11.00 37.50 22.130
L70 Lawes 1970 G06 2.408 1.360 4.00 11.75 38.25 21.160

Crear un grÔfico de dispersión

# Cargar el paquete {ggplot2}
library(ggplot2)

Para crear un grƔfico se usa el comando ggplot():

ggplot(data = soybean)

Hasta acƔ solo asignamos al grƔfico el conjunto de datos que queremos visualizar. No se representa grƔficamente nada hasta que no se aƱaden mƔs capas.

Layers: AƱadir capas

Las capas sirven para proporcionar información sobre cómo queremos visualizar los datos. Esto se lleva a cabo a través de un geom. Este es un ejemplo sencillo usando geom_point() que es el geom correspondiente un diagrama de dispersión (cada tipo de grÔfico tiene el suyo). En primer lugar, mediante aes() asignamos las coordenadas x e y.

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield))

Los grÔficos de dispersión son grÔficos de puntos que se usan para averiguar la intensidad de la relación entre dos variables numéricas.

Si queremos añadir información sobre la localidad lo podemos hacer a partir de diferentes colores, especificando que el color de los puntos dependa de la variable loc:

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield, col = loc))

El argumento aes() (aesthetics) asigna variables a ciertos aspectos del grƔfico. En general, cada geom admitirƔ un conjunto determinado de aesthetics. En el caso particular de geom_point, mediante aes() podemos hacer depender de una variable otros aspectos como la forma o el tamaƱo de los puntos. Por ejemplo, para tomar una aesthetic como forma necesitamos una variable del tipo factor de la siguiente forma:

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield, shape= year))   # una forma para cada aƱo

En este ejemplo podemos querer distinguir las distintas localidades y los dos años de evaluación, por lo que podemos agregar mÔs de un aspecto al grÔfico:

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield, shape = year, col = loc))

Estos aspectos se pueden fijar en lugar de hacerlos depender de una variable. En este caso el valor del argumento se asigna fuera de la lista de aesthetics. Es necesario consultar la web de {ggplot2} para saber qué aesthetics admite cada geom en particular. También se puede consultar la documentación directamente desde Help en RStudio o tipeando el comando ?geom_point en consola.

En el siguiente ejemplo se fijó el color de los puntos, su tamaño y el grado de transparencia, lo que es útil cuando hay muchos puntos:

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield),
                     col = 'darkblue',    # color de los puntos
                     size = 3,            # tamaƱo de los puntos
                     alpha = 0.3)         # nivel de transparencia de los puntos 

Stats: Transformaciones estadĆ­sticas

Algunos geoms requieren llevar a cabo alguna transformación estadística (stat) que toma un conjunto de datos y crea otro nuevo. De esta forma combinando geom y stat se pueden obtener una gran variedad de visualizaciones. A veces se puede asignar una transformación estadística a un geom mediante el argumento method. Por ejemplo, geom_smooth() usa distintos métodos para estimar la curva de regresión de una variable por otra, incluyendo el método de mínimos cuadrados, que es el mÔs conocido:

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield),
                     col = 'darkblue',
                     size = 3,
                     alpha = 0.3) + 
  geom_smooth(aes(x = size, y = yield), method = 'lm')    # AƱade la recta
## `geom_smooth()` using formula = 'y ~ x'

Vemos el siguiente mensaje en consola: geom_smooth() using formula 'y ~ x'. Esto nos estÔ advirtiendo que por defecto estÔ graficando y en función de x, uno podría especificarlo o querer graficar una relación diferente, por ejemplo logarítmica formula = 'y ~ log(x)' o una cuadrÔtica formula = 'y ~ x + I(x^2)'. Incluso podemos graficar mÔs de una para comparar usando dos geom_smooth() por separado.

ggplot(data = soybean) +
  geom_point(aes(x = size, y = yield),
                     col = 'darkblue',
                     size = 3,
                     alpha = 0.3) + 
  geom_smooth(aes(x = size, y = yield), method = 'lm', formula = 'y ~ x', col = 'blue') + # lineal
  geom_smooth(aes(x = size, y = yield), method = 'lm', formula = 'y ~ x + I(x^2)', col = 'red') # cuadrƔtica

Ahora que añadimos un nuevo geom podemos analizar que la asignación de las coordenadas x e y a las variables podría haberse hecho directamente en la primera línea obteniendo mismos resultados y evitando repetir tanto código.

ggplot(data = soybean, aes(x = size, y = yield)) +     # Esta asignación se fija para todos los geoms 
  geom_point(col = 'darkblue', size = 3, alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x')

La repetición de los aes() en cada geom tiene la ventaja de permitir hacer una asignación a variables diferentes en cada uno de ellos en lugar de mantener la asignación fija para todos.

Con geom_smooth() vemos que se representa el intervalo de confianza. En el siguiente ejemplo lo eliminamos y, ademƔs, modificamos otros aspectos estƩticos del grƔfico:

# Modificamos algunos aspectos estƩticos del grƔfico:
ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',    # recta en color negro
              se=FALSE)         # Se eliminan el intervalo de confianza (se=standard error)

Si asignamos el tipo de lĆ­nea a la localidad, obtendremos las rectas de mĆ­nimos cuadrados para las cuatro localidades:

ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(aes(linetype = loc),
              method = 'lm', formula = 'y ~ x',
              col = 'black',    # Se representa la recta en color negro
              se=FALSE)         # Se eliminan las bandas de confianza (se=standard error)

Facets: paneles

En el grƔfico anterior estamos mostrando muchas cosas en un solo grƔfico. Puede ser conveniente representar un grƔfico para cada una de las localidades por separado, es decir, por grupos. Los facets, otro elemento importante en {ggplot2}, determinan que se debe representar un grƔfico condicionado a cada uno de los valores de alguna de las variables. Se aƱaden de la siguiente forma:

ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',
              se=FALSE) + 
  facet_wrap( ~ loc)       # un grƔfico para cada localidad

Scales: escalas

Podemos aƱadir un tƭtulo o cambiar las etiquetas de los ejes aƱadiendo una nueva capa con el comando labs(). Para modificar los lƭmites de los ejes usamos xlim() e ylim(). TambiƩn se pueden modificar los lƭmites de variables continuas (x e y) con scale_x_continuous() y scale_y_continuous().

ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',
              se=FALSE) + 
  facet_wrap( ~ loc)   +
  # tĆ­tulos y etiquetas ejes:
  labs(title='Australia soybean',
       x='Size (millimeters)',
       y='Yield (metric tons / hectare)') +
  # lĆ­mites ejes 2 formas:
  xlim(3, 25) +
  scale_y_continuous(limits = c(0, 5)) 

TambiƩn se puede elegir escalas de colores manuales con scale_color_manual(). Se debe especificar en aes() quƩ variable se desea colorear y eliminar cualquier color fijo dentro del geom.

ggplot(data = soybean, aes(x = size, y = yield, col = loc)) + # color por localidad
  geom_point(size = 3, alpha = 0.5) + # No dejamos color fijo
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',
              se=FALSE) + 
  facet_wrap( ~ loc)   +
  labs(title='Australia soybean',
       x='Size (millimeters)',
       y='Yield (metric tons / hectare)') +
  scale_color_manual(values=c('#6baed6','#4292c6','#2171b5','#084594')) # escala colores

Themes: estilos

Hasta ahora usamos el estilo de grƔficos por defecto con su caracterƭstico fondo gris. Se puede cambiar aƱadiendo una nueva capa. usando diferentes themes.

Themes {ggplot2} themes

En el siguiente grƔfico donde analizamos cada localidad-aƱo (env) cambiamos a theme_bw():

ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',
              se=FALSE) + 
  facet_wrap( ~ env, nrow = 4)   + # nrow: indicamos nĆŗmero de filas
  labs(title='Australia soybean',
       x='Size (millimeters)',
       y='Yield (metric tons / hectare)') +
  theme_bw()

MƔs grƔficos

Vamos a graficar algunos ejemplos de los tipos de grƔficos mƔs utilizados: lƭneas, barras, histogramas y diagramas de cajas (boxplots).

LĆ­neas

Los grƔficos de lƭneas muestran una serie como un conjunto de puntos conectados mediante una sola lƭnea. Los grƔficos de lƭneas se usan para representar datos que tienen lugar durante un perƭodo continuado de tiempo. En {ggplot2} aƱadimos una capa con el comando geom_line().

En este caso tomaremos datos de 9 aƱos (1974-1982) de la altura de cebada.

# Dataset cebada
barley <- aastveit.barley.height
str(barley)
## 'data.frame':    135 obs. of  3 variables:
##  $ year  : int  1974 1975 1976 1977 1978 1979 1980 1981 1982 1974 ...
##  $ gen   : Factor w/ 15 levels "G01","G02","G03",..: 1 1 1 1 1 1 1 1 1 2 ...
##  $ height: num  81 67.3 71.5 64.3 55.8 84.9 86.2 88 72 72.3 ...

Si observamos el dataset posee 15 genotipos de cebada, haremos un subset de nuestros datos y veremos cómo varió la altura en un dado genotipo (G01) a través de los años. {ggplot2} nos permite generar el subset dentro de ggplot() para evitar generar un nuevo data frame.

ggplot(data = subset(barley, gen == "G01")) +
  geom_line(aes(x = year, y = height))

Si queremos analizar todos los genotipos, con un facet por genotipo podemos diferenciarlos en distintos grƔficos. Para trabajar un poco mƔs la estƩtica del grƔfico podemos ensanchar la lƭnea (linewidth) y colorearla de azul (color), se puede querer agregar puntos a travƩs de una nueva capa utilizando geom_point() y cambiar a theme_bw().

ggplot(data = barley, aes(x = year, y = height)) + # tomando el dataset completo
  geom_line(color = 'blue', linewidth = 1.2) + # color y grosor de la lĆ­nea
  geom_point() + # agregamos puntos
  facet_wrap( ~ gen) + # agrupamos por genotipo
  labs(title='Barley heights in Norway',
     x='Year',
     y='Height (cm)') +
  theme_bw()

Barras

Los grÔficos de barras se utilizan para representar una variable categórica o variables cuantitativas discretas. Se representan barras verticales proporcionales a los valores de la variable en cada categoría o valor. Para crear grÔficos de barras con {ggplot2} se usa geom_bar().

Para hacer nuestro primer grÔfico de barras vamos a utilizar un dataset de corderos que contiene la variable categórica raza (breed) y graficaremos cuÔntos individuos hay de cada una de las 3 razas.

# Dataset corderos
lamb <- alwan.lamb
str(lamb)
## 'data.frame':    340 obs. of  11 variables:
##  $ year : int  1980 1980 1980 1980 1980 1980 1980 1980 1980 1980 ...
##  $ breed: Factor w/ 3 levels "BR","BRP","PP": 3 3 3 3 3 3 3 3 3 3 ...
##  $ sex  : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 2 2 2 ...
##  $ sire0: Factor w/ 34 levels "S01","S02","S03",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ shape: Factor w/ 5 levels "LF1","LF2","LF3",..: 5 4 3 2 1 5 4 3 2 1 ...
##  $ count: int  31 17 0 0 0 21 8 0 0 0 ...
##  $ sire : Factor w/ 34 levels "S01","S02","S03",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ yr   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ b1   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ b2   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ b3   : int  0 0 0 0 0 0 0 0 0 0 ...
# GrƔfico
ggplot(lamb, aes(breed)) + 
  geom_bar()

Usando geom_text() podemos agregar como texto el valor del count sobre las barras:

# GrƔfico
ggplot(lamb, aes(breed)) + 
  geom_bar() +
  geom_text(stat='count', aes(label=after_stat(count)), vjust=-0.5)

Ahora invertimos las barras con cord_flip():

ggplot(lamb, aes(breed)) + 
  geom_bar(fill = "darkblue") + 
  labs(title='Lambs',
     x='Breed',
     y='Count') +
    coord_flip() # invertimos ejes

Si tuvieramos estos datos ya contabilizados en una tabla de frecuencias, tendremos que especificar en aes() que la variable y a graficar es la variable con las frecuencias. AdemƔs tendramos que usar geom_bar(stat = "identity") o directamente usar geom_col() que ya usa por defecto stat_identity().

Veamos con un ejemplo. Replicamos los nĆŗmeros anteriores armando nuestro propio data frame con el nĆŗmero total de cada raza.

# Data frame
df <- data.frame (breed  = c("BR", "BRP", "PP"),
                  n = c(30, 180, 130))

# GrƔfico de barras especificando x e y, usando geom_bar(stat = "identity")
ggplot(df, aes(x = breed, y = n)) + 
  geom_bar(stat = "identity",  fill = "darkblue") + 
  labs(title='Con geom_bar(stat = "identity")')

# Con geom_col()
ggplot(df, aes(x = breed, y = n)) +
  geom_col(fill = "steelblue") + 
  labs(title='Con geom_col()')

Podemos querer darle un orden a las barras de menor a mayor basado en el n. Para ello usamos reorder(). Ordenamos la variable x (breed) en base a la variable y (n) especificando x = reorder(breed, n) en el siguiente código:

ggplot(df, aes(x = reorder(breed, n), y = n)) +
  geom_col(fill = "steelblue")

Histogramas

Un histograma es un grÔfico de una variable en forma de barras que se utiliza para representar la distribución de frecuencias de una variable. Para graficar un histograma se usa geom_histogram().

Volviendo al dataset de soja, veamos el histograma para proteĆ­na. Con las opciones por defecto resulta:

ggplot(data = soybean) +
  geom_histogram(aes(x = protein))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Con el siguiente código añadimos un y= after_stat(density) para graficar las frecuencias relativas, cambiamos el número de rectÔngulos del histograma (bins), los colores y otros aspectos del grÔfico:

ggplot(data = soybean) +
  geom_histogram(aes(x = protein,
                     y= after_stat(density)),  # para que el Ɣrea sea 1, frec relativas
                 bins=20,
                 fill='blue', # color barra
                 col='black') + # color contorno
  labs(x = 'Protein (%)', y = 'Relative frequency', title = 'Histogram') +
  facet_wrap( ~ loc, nrow = 2) +
  theme_bw() +  
  theme(panel.grid = element_blank())  # elimina la grilla de fondo

Diagramas de cajas

Los diagramas de caja o boxplots, también conocidos como diagramas de cajas y bigotes, son una representación grÔfica que permite resumir las características principales de los datos (posición, dispersión, asimetría) e identificar la presencia de valores atípicos. Para representar diagramas de cajas se usa geom_boxplot().

La caja estĆ” atravesada por una lĆ­nea (la mediana o Q2), su base representa el Q1 y su parte superior, el Q3. Las lĆ­neas exteriores representan Q1 - 1.5 IQR y Q3 + 1.5 IQR (IQR: rango intercuartil). Los puntos corresponden a valores atĆ­picos (outliers).

Ahora tomaremos un dataset de lechuga que posee medidas de peso (weight) de varias plantas (n = 18) en distintos dĆ­as de observacion para 3 tratamientos (trt).

# Dataset lechuga
lettuce <- pederson.lettuce.repeated
str(lettuce)
## 'data.frame':    594 obs. of  4 variables:
##  $ plant : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ day   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ trt   : Factor w/ 3 levels "T1","T2","T3": 1 1 1 1 1 1 1 1 1 1 ...
##  $ weight: num  44 48.4 55.5 48.6 48.1 42.6 55.4 47.5 48.8 51.2 ...

Supongamos que queremos analizar las observaciones hechas en el último día de medición (a los 40 días) y comparar los 3 tratamientos. Con las opciones por defecto resulta:

# GrƔfico de cajas
ggplot(data = subset(lettuce, day == 40)) +
  geom_boxplot(aes(x = trt, y = weight))

Para cambiar los ejes se usa coord_flip(). Es posible aƱadir los puntos con otra capa usando geom_jitter(). Cambiaremos otros aspectos del grƔfico, obteniendo lo siguiente:

ggplot(data = subset(lettuce, day == 40)) +
  geom_boxplot(aes(x = trt, y = weight),
               col = 'black', fill = "#1134f7", alpha=0.75) + # relleno en código hex, alpha: transparencia
  coord_flip() + # cambiar ejes
  geom_jitter(aes(x = trt, y = weight), # agregar puntos
              size = 3,
              alpha = 0.5,
              width = 0.1) +
  labs(title='Boxplot',
       x='Treatment',
       y='Weight (g)') +
  theme_classic()

GrƔficos mƔs avanzados

GrƔfico de violƭn

Mientras que un boxplot muestra la distribución de datos a través de cinco estadísticas numéricas y es mÔs adecuado para identificar valores atípicos, un grÔfico de violín muestra la distribución de datos como una densidad.

ggplot(data = subset(lettuce, day == 40), aes(x = trt, y = weight)) + 
  geom_violin()

Ambos grÔficos son útiles para visualizar la distribución de los datos y pueden ser utilizados en conjunto para una exploración mÔs completa de los datos. AdemÔs modificamos aspectos estéticos y obtenemos el siguiente grÔfico:

ggplot(data = subset(lettuce, day == 40), aes(x = trt, y = weight)) +
  geom_violin(fill = "#9ecae1") +
  geom_boxplot(width = 0.15) + # agregamos boxplot
  geom_jitter(size = 2, alpha = 0.5, width = 0.05) + # agregamos puntos
  labs(title='GrƔfico de violƭn',
     x='Treatment',
     y='Weight (g)') +
  theme_classic()

En la siguiente animación se puede ver la progresión de un simple grÔfico a uno mÔs completo:

Para obtener el código de R para cada grafico, click aquí.

GrƔfico de barras apiladas

Un diagrama de barras apiladas muestra un valor numérico para un conjunto de entidades divididas en grupos y subgrupos. Por lo tanto, el conjunto de datos debe proporcionar al menos dos variables categóricas para los niveles de grupo (en eje x) y subgrupo (en fill).

ggplot(data = lamb, aes(x = breed, fill = sex)) + 
  geom_bar()

Puede realizarse la contabilización como en el caso anterior o graficarse una variable numérica especificÔndola como y y agregando geom_bar(stat = "identity").

Para mostrar las barras apiladas como un porcentaje se debe especificar position = "fill" dentro de geom_bar(). Así se ve claramente la relación de las partes constituyentes con el todo, en este caso, para cada raza un 50% son hembras y un 50% son machos.

ggplot(data = lamb, aes(x = breed, fill = sex)) + 
  geom_bar(position = "fill")

GrƔfico de barras agrupadas

Para que las barras estƩn una al lado de la otra se debe especificar position = "dodge" dentro de geom_bar().

ggplot(data = lamb, aes(x = sex, fill = breed)) + 
  geom_bar(position = "dodge")

Modificanmos el grƔfico eligiendo colores y modificando etiquetas:

ggplot(data = lamb, aes(x = sex, fill = breed)) + 
  geom_bar(position = "dodge") + 
  scale_fill_manual(values=c("#2171b5", "#9ecae1", "#08306b")) +
    labs(title='GrƔfico de barras agrupadas',
       x='Sex',
       y='Count') +
  theme_classic()

Guardar un grƔfico

Hasta acƔ, todos nuestros grƔficos aparecieron en la ventana Plots de RStudio. Esta representa un dispositivo grƔfico (graphic device) donde se puede visualizar un grƔfico.

Para exportar un grÔfico existen diferentes formas que veremos a continuación.

  1. Una de ellas es mandando nuestro grÔfico a un dispositivo grÔfico como JPG, PNG o algún otro tipo de archivo que pueda ser almacenado en nuestro disco duro.

Para exportar un grƔfico usamos alguna de las siguientes funciones, cada una corresponde con un tipo de archivo distinto: jpeg(), pdf(), png(), tiff().

Cada una de estas funciones tiene los siguientes argumentos tres argumentos principales:

  • filename: nombre y ruta del archivo de imagen a crear. Si no especificamos una ruta completa, entonces el el archivo serĆ” creado en nuestro directorio de trabajo.
  • width: ancho del archivo de imagen a crear, por defecto en pixeles.
  • height: alto del archivo de imagen a crear, por defecto en pixeles.

También se puede especificar unit (para cambiar las unidades de ancho y alto), res (resolución en ppi), pointsize (tamaño del texto) y bg (color de fondo del grÔfico), entre otros.

La manera de utilizar estas funciones es llamÔndolas antes de llamar a una función que genere un grÔfico. Al hacer esto, le indicamos a R que en lugar de mandar nuestro grÔfico a una ventana del escritorio, lo mande a un dispositivo grÔfico distinto. Finalmente, llamamos a la función dev.off(), para cerrar el dispositivo grÔfico que hemos elegido, de este modo se crearÔ un archivo y podremos crear mÔs grÔficos después.

png(filename = "myfirstplot.png", width = 12, height = 6, units = "in", res = 300)

ggplot(data = soybean, aes(x = size, y = yield)) +
  geom_point(col = 'darkblue',
             size = 3,
             alpha = 0.3) + 
  geom_smooth(method = 'lm', formula = 'y ~ x',
              col = 'black',
              se=FALSE) + 
  facet_wrap( ~ env, nrow = 4)   + 
  labs(title='Australia soybean',
       x='Size (millimeters)',
       y='Yield (metric tons / hectare)') +
  theme_bw() 

dev.off()
  1. Una forma manual de hacer esto desde RStudio es desde Export en la ventana Plots o desde Save as en la ventana R Graphics. Por ejemplo, desde Export podremos especificar el formato, el directorio, el nombre del archivo y su ancho y alto:
  1. Con ggsave() se puede guardar el grÔfico en png, jpeg, tiff, svg, eps, pdf, entre otros. Se especifica el nombre y el directorio, el ancho y alto en sus unidades ("in", "cm", "mm", or "px") y la resolución (dpi).
my_plot <- ggplot(data = subset(lettuce, day == 40)) +
            geom_boxplot(aes(x = trt, y = weight),
                         col = 'black', fill = "#1134f7", alpha=0.75) +
            coord_flip() +
            geom_jitter(aes(x = trt, y = weight),
                        size = 3,
                        alpha = 0.5,
                        width = 0.1) +
            labs(title='Boxplot',
                 x='Treatment',
                 y='Weight (g)') +
            theme_classic()

ggsave("mythirdplot.png", plot = my_plot, width = 12, height = 6, units = "in", dpi = 300)

Ejercitación

Vamos a obtener el siguiente grƔfico siguiendo las consignas detalladas debajo.

Utilizando el dataset australia.soybean de {agridat}:

  1. Cargar los paquetes necesarios

  2. Convertir la variable year a factor

  3. Copiar el siguiente grƔfico base para comenzar a trabajar:

ggplot(data = soybean, aes(x = height, y = protein)) +
  geom_point(size = 3, alpha = 0.5)
  1. Dividir el grƔfico en grupos/paneles en base al ambiente (env) y agregar nrow = 4 para obtener 4 filas

  2. Modificar los puntos de geom_point() con color determinado por localidad y forma, por aƱo

  3. Agregar etiquetas a los ejes:
  • TĆ­tulo: Soja en Australia
  • Eje x: Altura (m)
  • Eje y: ProteĆ­na (%)
  • Color: Localidad (modifica tĆ­tulo de leyenda)
  • Shape: AƱo (modifica tĆ­tulo de leyenda)
  1. Modificar theme a theme_bw()

  2. Guardar grƔfico en png

BibliografĆ­a

Documentación {ggplot2}

Function reference {ggplot2}

Cheat Sheet {ggplot2}

cheatsheet1 cheatsheet2

Extensiones de ggplot2

Libro {ggplot2}

R graphics cookbook

R charts